
///////////////////////////////////////////////////////////////////////////////
//
//  Copyright (c) 2009, Perry L Miller IV
//  All rights reserved.
//  BSD License: http://www.opensource.org/licenses/bsd-license.html
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
//
//  Functors that return the boolean opposite.
//
///////////////////////////////////////////////////////////////////////////////

#ifndef _USUL_ADAPTERS_NOT_H_
#define _USUL_ADAPTERS_NOT_H_


namespace Usul {
namespace Adapters {


///////////////////////////////////////////////////////////////////////////////
//
//  A functor that return the boolean opposite.
//
///////////////////////////////////////////////////////////////////////////////

template < class F > struct Not
{
  Not ( F f ) : _f ( f ){}
  Not ( const Not &f ) : _f ( f._f ){}
  bool operator () ()
  {
    return !_f();
  }
  template < class Arg > bool operator () ( const Arg &a )
  {
    return !_f ( a );
  }
  operator bool ()
  {
    return !_f();
  }
private:
  Not &operator = ( const Not & );
  F _f;
};


///////////////////////////////////////////////////////////////////////////////
//
//  Make functor.
//
///////////////////////////////////////////////////////////////////////////////

template < class F > inline Not < F > not ( F f )
{
  return Not < F > ( f );
}


} // namespace Adapters
} // namespace Usul


#endif // _USUL_ADAPTERS_NOT_H_
